// 定义页面
Page({
  // 页面初始数据
  data: {
    // 班级列表数组
    classList: [],
    // 当前选中的班级对象
    currentClass: null,
    // 学生列表数组
    studentList: [],
    // 搜索框输入的值
    searchValue: '',
    // 是否显示学生详情弹窗
    showStudentDetailModal: false,
    // 当前查看的学生详情对象
    currentStudentDetail: null,
    // 心理咨询记录数组 (此属性在后续代码中未被直接使用，可能为预留或已废弃)
    consultationRecords: []
  },

  // 页面加载时触发
  onLoad() {
    // 调用加载班级列表的方法
    this.loadClassList();
  },

  // 加载班级列表
  async loadClassList() {
    try {
      // 初始化云数据库
      const db = wx.cloud.database();
      // 获取当前登录用户的缓存信息
      const userInfo = wx.getStorageSync('userInfo');
      
      // 如果用户信息不存在，则提示用户先登录
      if (!userInfo) {
        wx.showToast({
          title: '请先登录',
          icon: 'none'
        });
        return;
      }
      
      // 构建数据库查询对象，目标集合为 'classes'
      let query = db.collection('classes');
      
      // 如果用户角色为辅导员，则根据辅导员管理的班级进行筛选
      if (userInfo.role === 'counselor') {
        // 如果辅导员管理的班级信息存在且为数组且长度大于0
        if (userInfo.classes && Array.isArray(userInfo.classes) && userInfo.classes.length > 0) {
          // 获取数据库查询指令
          const _ = db.command;
          // 构建查询条件，班级名称在辅导员管理的班级列表内
          query = query.where({
            name: _.in(userInfo.classes)
          });
        } else if (userInfo.class) {
          // 兼容旧数据结构，辅导员只管理一个班级的情况
          query = query.where({
            name: userInfo.class
          });
        }
      }
      
      // 执行查询并获取查询结果
      const { data } = await query.get();
      // 更新页面数据，包括班级列表和当前选中的班级 (默认为第一个班级)
      this.setData({
        classList: data,
        // 自动选择第一个班级
        currentClass: data.length > 0 ? data[0]._id : null
      });
      
      // 如果班级列表不为空，则自动加载第一个班级的学生列表
      if (data.length > 0) {
        this.loadStudentList(data[0]._id);
      }
    } catch (error) {
      // 捕获并打印加载班级列表过程中的错误
      console.error('加载班级列表失败', error);
      // 显示错误提示
      wx.showToast({
        title: '加载班级列表失败',
        icon: 'none'
      });
    }
  },

  // 加载学生列表
  async loadStudentList(classId) {
    // 如果班级ID不存在，则直接返回
    if (!classId) return;
    
    try {
      // 显示加载提示框
      wx.showLoading({
        title: '加载中',
      });
      
      // 初始化云数据库
      const db = wx.cloud.database();
      // 查询 'users' 集合中指定班级ID且角色为 'student' 的学生信息
      const { data } = await db.collection('users')
        .where({
          class: classId,
          role: 'student'
        })
        .get();
      // 更新页面数据，设置学生列表
      this.setData({
        studentList: data
      });
      
      // 隐藏加载提示框
      wx.hideLoading();
    } catch (error) {
      // 捕获并打印加载学生列表过程中的错误
      console.error('加载学生列表失败', error);
      // 显示错误提示
      wx.showToast({
        title: '加载学生列表失败',
        icon: 'none'
      });
      // 隐藏加载提示框
      wx.hideLoading();
    }
  },

  // 选择班级事件处理函数
  onClassSelect(e) {
    // 从事件对象中获取选中的班级ID
    const classId = e.currentTarget.dataset.id;
    // 更新页面数据，设置当前选中的班级ID
    this.setData({
      currentClass: classId
    });
    // 调用加载学生列表的方法，加载选中班级的学生
    this.loadStudentList(classId);
  },

  // 搜索学生事件处理函数
  onSearch(e) {
    // 获取搜索框输入的值并去除首尾空格
    const searchValue = e.detail.value.trim();
    // 更新页面数据，设置搜索值
    this.setData({ searchValue });
    
    // 如果搜索框为空
    if (searchValue === '') {
      // 重新加载当前班级的全部学生列表
      this.loadStudentList(this.data.currentClass);
      return;
    }
    
    // 在本地学生列表中进行搜索过滤 (此段逻辑被后续云数据库搜索覆盖，注释掉以避免混淆)
    // const filteredStudents = this.data.studentList.filter(student => {
    //   return student.name.toLowerCase().includes(searchValue.toLowerCase());
    // });
    // this.setData({
    //   studentList: filteredStudents
    // });

    // 使用云数据库进行模糊搜索
    const db = wx.cloud.database();
    // 查询 'users' 集合中符合条件的学生
    db.collection('users')
      .where({
        // 限制在当前班级
        class: this.data.currentClass,
        // 角色为学生
        role: 'student',
        // 姓名模糊匹配搜索值 (不区分大小写)
        name: db.RegExp({
          regexp: searchValue,
          options: 'i', // i 表示不区分大小写
        })
      })
      .get()
      .then(res => {
        // 更新页面数据，设置搜索到的学生列表
        this.setData({
          studentList: res.data
        });
      })
      .catch(err => {
        // 捕获并打印搜索过程中的错误
        console.error('搜索失败', err);
      });
  },

  // 显示学生详情弹窗事件处理函数
  async showStudentDetail(e) {
    // 从事件对象中获取学生ID
    const studentId = e.currentTarget.dataset.id;
    // 在当前学生列表中查找对应的学生对象
    const student = this.data.studentList.find(s => s._id === studentId);
    
    // 如果找到了学生对象
    if (student) {
      try {
        // 显示加载提示框
        wx.showLoading({
          title: '加载中',
        });
        
        // 初始化云数据库
        const db = wx.cloud.database();
        // 查询该学生的心理测试结果，按创建时间降序排序
        const { data: testResults } = await db.collection('psychological_tests')
          .where({
            userId: studentId
          })
          .orderBy('createTime', 'desc')
          .get();
          
        // 查询该学生的心理咨询记录，按创建时间降序排序
        const { data: consultationRequests } = await db.collection('consultation_requests')
          .where({
            // 注意：这里应该是 studentId，而不是 student._id，确保查询条件正确
            studentId: studentId
          })
          .orderBy('createTime', 'desc')
          .get();
        
        // 更新页面数据，显示学生详情弹窗，并设置当前学生详情
        this.setData({
          showStudentDetailModal: true,
          currentStudentDetail: {
            ...student, // 学生基本信息
            testResults: testResults || [], // 学生的心理测试结果，如果为空则设为空数组
            consultationRequests: consultationRequests || [] // 学生的心理咨询记录，如果为空则设为空数组
          }
        });
        
        // 隐藏加载提示框
        wx.hideLoading();
      } catch (error) {
        // 捕获并打印加载学生详情过程中的错误
        console.error('加载学生详情失败', error);
        // 显示错误提示
        wx.showToast({
          title: '加载学生详情失败',
          icon: 'none'
        });
        // 隐藏加载提示框
        wx.hideLoading();
      }
    }
  },

  // 隐藏学生详情模态框
  hideStudentDetailModal() {
    // 更新页面数据，设置不显示学生详情弹窗
    this.setData({
      showStudentDetailModal: false
    });
  },

  // 导出心理健康报告 (功能预留)
  exportHealthReport() {
    // 实际的导出功能可能需要云函数支持，此处仅为提示
    wx.showToast({
      title: '导出功能开发中',
      icon: 'none'
    });
  },

  // 查看学生心理状况，跳转到心理监测页面
  viewPsychologicalStatus(e) {
    // 从事件对象中获取学生ID
    const studentId = e.currentTarget.dataset.id;
    // 跳转到心理监测页面，并携带学生ID参数
    wx.navigateTo({
      url: `/pages/psychological-monitor/index?studentId=${studentId}`
    });
  },

  // 前往谈心谈话页面
  navigateToCounselingLog(e) {
    // 从事件对象中获取学生ID
    const studentId = e.currentTarget.dataset.id;
    // 跳转到谈心谈话记录页面，并携带学生ID参数
    wx.navigateTo({
      url: `/pages/counseling-log/index?studentId=${studentId}`
    });
  }
});
